package com.mdxl.first.controller;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.mdxl.first.service.BaseService;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.ServletRequestUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


@Controller
@RequestMapping(value = "/first")
public class FirstController extends BaseService{

    private Logger logger =Logger.getLogger(String.valueOf(getClass()));
    private static final int pageSize =10;
    /*
    *
    * 这些都是mongodb中的操作符：java查询代码中会用到
 $or,$regex,$gte,$lte,$gt,$lt
 $inc 在字段数值上新增固定值
 $inc 在字段数值上新增固定值
 $set 集合新增字段或者更新字段的值
 $unset 删除键
 $push 添加元素数值，重复的时候也可以添加
 $pop 从数组的头(-1)或者尾(1,0)删除数组中的元素
 $sum、$avg、$min、$max、$push、$addToSet、$first、$last
 $project：修改输入文档的结构。可以用来重命名、增加或删除域，也可以用于创建计算结果以及嵌套文档。
 $match：用于过滤数据，只输出符合条件的文档。$match使用MongoDB的标准查询操作。
 $limit：用来限制MongoDB聚合管道返回的文档数。
 $skip：在聚合管道中跳过指定数量的文档，并返回余下的文档。
 $unwind：将文档中的某一个数组类型字段拆分成多条，每条包含数组中的一个值。
 $group：将集合中的文档分组，可用于统计结果。
 $sort：将输入文档排序后输出。
 $geoNear：输出接近某一地理位置的有序文档。
    * */


    //其实这个写的不太好，FirstController extends BaseService -<
    // ->其实应该创建一个Service 来extends BaseService,不过为了不写Service那一层，就只好写在这里了

   @RequestMapping(value = "/get",method = RequestMethod.GET)
   @ResponseBody
   public String get(HttpServletRequest request){
       //接下来这些参数类似于京东淘宝购物页面，有多个筛选条件，交个区间，价格等等。。

       int page = ServletRequestUtils.getIntParameter(request,"page",0);
       String roleName =ServletRequestUtils.getStringParameter(request,"roleName",null);
       //solrName 在一个搜索框中同时可以搜索昵称、手机、邮箱、账号，所以这个代码用到JSONArray
       String solrName =ServletRequestUtils.getStringParameter(request,"roleName",null);
       String startTime =ServletRequestUtils.getStringParameter(request,"startTime",null);
       String endTime =ServletRequestUtils.getStringParameter(request,"endTime",null);
       logger.debug("roleName"+roleName);
       logger.debug("solrName"+solrName);
       logger.debug("startTime"+startTime);
       logger.debug("endTime"+endTime);
       //query为查询条件
       DBObject query =new BasicDBObject();

       JSONObject jsonObject = new JSONObject();
       jsonObject.put("$ne","超级管理员");
       query.put("name",jsonObject);

       //搜索文本中可以搜索的四个字段的查询代码
       if (solrName !=null && !solrName.isEmpty()){
           //搜索框中搜索昵称
           JSONObject nickJson = new JSONObject();
           DBObject nickDB =new BasicDBObject();
           nickJson.put("$regex",solrName.trim());
           nickDB.put("nickName",nickJson);
           //搜索框中为手机，这个利用克隆
           DBObject mobileDB =new BasicDBObject();
           mobileDB.put("mobile",nickJson.clone());
           //搜索框中为邮箱
           DBObject emailDB =new BasicDBObject("email",nickJson.clone());
           //搜索框中为账号
           DBObject accountDB =new BasicDBObject("account",nickJson.clone());
           JSONArray $or =new JSONArray();
           $or.add(nickDB);
           $or.add(mobileDB);
           $or.add(accountDB);
           $or.add(emailDB);
           query.put("$or",$or);
       }
        //时间区域内的查询代码,如果是价格区间代码类似
       if (!StringUtils.isEmpty(startTime) || !StringUtils.isEmpty(endTime)){
            JSONObject timeJson =new JSONObject();
            timeJson.put("$gte",startTime);
            timeJson.put("$lte",endTime);
            query.put("createAt",timeJson);
       }
       //查询返回的字段，{} == 意思是返回集合中所有字段
       String fields ="{}";

       JSONObject orderby =new JSONObject();
       orderby.put("createdAt",-1);//在monggodb中，-1降序，1升序

       //t_role 为mongodb 的一个集合 相当于MySQL中的一个表
       DBObject dbObject1 = mongoReadDao.find(query.toString(), fields, orderby.toJSONString(), "t_role",page*pageSize,pageSize);

       List<JSONObject> lists = null;
       if (dbObject1 != null && (int)dbObject1.get("count")>0){
           lists = new ArrayList<JSONObject>();
           BasicDBList results =(BasicDBList) dbObject1.get("results");
           JSONObject obj = null;
           for (Object item : results){
               obj = JSONObject.parseObject(item.toString());
               lists.add(obj);
           }
       }
       //下面是分页
       int counts =Integer.parseInt(dbObject1.get("count").toString());
       int totalPage = 0;
       if(counts<=pageSize){
           totalPage = 1;
       }else{
           totalPage = counts/pageSize;
           if(totalPage*pageSize<counts){
               totalPage+=1;
           }
       }

       JSONObject resultObj = new JSONObject();
       resultObj.put("list", lists);
       resultObj.put("currentPage", page);
       resultObj.put("counts", counts);
       resultObj.put("totalPage", totalPage);

       return resultObj.toJSONString();
   }

   @RequestMapping(value = "/insert",method = RequestMethod.POST)
   @ResponseBody
    public String add(HttpServletRequest request) throws Exception{
       String account =ServletRequestUtils.getStringParameter(request,"account",null);
       String email =ServletRequestUtils.getStringParameter(request,"email",null);
       String mobile =ServletRequestUtils.getStringParameter(request,"mobile",null);
       Date date =new Date();
       SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
       String createAt =simpleDateFormat.format(date);

       logger.debug("account==>"+account);
       logger.debug("email==>"+email);
       logger.debug("mobile==>"+mobile);

       JSONObject jsonObject =new JSONObject();
       jsonObject.put("account",account);
       jsonObject.put("email",email);
       jsonObject.put("mobile",mobile);
       JSONObject result =mongoWriteDao.save("t_admin",jsonObject.toJSONString());
       return result.toJSONString();
   }

    @RequestMapping(value = "/update",method = RequestMethod.POST)
    @ResponseBody
    public String update(HttpServletRequest request)throws Exception{
       String email =ServletRequestUtils.getStringParameter(request,"email","152@qq.com");
       String id = ServletRequestUtils.getStringParameter(request,"id","5a24b0bae6ebae2a742eeacb");
       logger.debug("email==>"+email);
       JSONObject jsonObject =new JSONObject();
       jsonObject.put("email",email);
       JSONObject result =mongoWriteDao.update("t_admin",jsonObject.toJSONString(),id);
       return result.toJSONString();
    }
}
